
package interfaz_practica3;

import java.awt.Color;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.WindowConstants;

import app_practica3.Damas;

import movimientos.ComprobadorMov;
import movimientos.ComprobadorMov.estiloJuego;

public class TableroFichas extends Tablero implements MouseListener{

	public enum estadoCasilla {LIBRE,PEON_ROJO,PEON_AZUL,DAMA_ROJA,DAMA_AZUL,ERROR};
	private Image peonRojo,damaRoja,peonAzul,damaAzul;
	private ComprobadorMov movimientos;
	private Damas damas;
	private boolean iniciado;
	private int espera;
	
	public TableroFichas(tamTablero tam, int borde, Damas d){
		this.tam = tam;
		switch(tam){
		case OCHO:
			tamCasilla = 60;
			break;
		case DIEZ:
			tamCasilla = 48;
			break;
		case DOCE:
			tamCasilla = 40;
			break;
		default:
			tamCasilla = 10;
		}
		damas = d;
		this.borde = borde;
		addMouseListener(this);
		iniciado = false;
		espera = 0;
	}
	
	public void paint(Graphics g){
		super.paint(g);
	}
	
	public int getNumFichJug1(){
		if(movimientos!=null)
			return movimientos.getNumFichJug1();
		return 0;
	}
	
	public int getNumFichJug2(){
		if(movimientos!=null)
			return movimientos.getNumFichJug2();
		return 0;
	}
	
	public void ponerImagenes(Image peonRojo, Image damaRoja, Image peonAzul, Image damaAzul){
		this.damaAzul = damaAzul;
		this.damaRoja = damaRoja;
		this.peonAzul = peonAzul;
		this.peonRojo = peonRojo;
	}
	
	public void pintarCasillas(Graphics g, int iniX, int iniY){
		int posX = iniX;
		int posY = iniY;
		
		for(int i=0;i<tamToInt();i++ ){
			for(int j=0;j<tamToInt();j++ ){
				if(((i+j)%2)==0) // mover a metodo auxiliar: pintarCasilla(i,j)
					g.setColor(Color.WHITE);
				else
					g.setColor(Color.DARK_GRAY);
				g.fillRect(posX, posY, tamCasilla, tamCasilla);
				posX+=tamCasilla;
			}
			posY+=tamCasilla;
			posX=iniX;
		}
	}
	
	public void pintarExtra(Graphics g){
		if(iniciado){
			boolean seleccionada;
			for(int i=0;i<tamToInt();i++ ){
				for(int j=0;j<tamToInt();j++ ){
					if(movimientos!=null){
						if(movimientos.getFilSel()==i && movimientos.getColSel()==j)
							seleccionada=true;
						else
							seleccionada=false;
						switch(movimientos.getCasilla(i, j)){
						case PEON_ROJO:
							pintarFicha(peonRojo,i,j,g,seleccionada);
							break;
						case PEON_AZUL:
							pintarFicha(peonAzul,i,j,g,seleccionada);
							break;
						case DAMA_ROJA:
							pintarFicha(damaRoja,i,j,g,seleccionada);
							break;
						case DAMA_AZUL:
							pintarFicha(damaAzul,i,j,g,seleccionada);
							break;
						default:	
						}
					}
				}
			}
		}
	}
	
	public void inicializar(){
		super.inicializar();
	}
	
	private String pedirNombre(String descripcion, Component padre, String valorDefecto){
		String s=null;
		String s1="Nombre del "+descripcion+":";
		if(valorDefecto=="ordenador")
			s1+=" (para jugar en solitario, escribir \"ordenador\")";
		while(s==null){
			s = (String)JOptionPane.showInputDialog(
				   padre,
				   s1,
				   "NOMBRE?",
				   JOptionPane.QUESTION_MESSAGE,
				   null,
				   null,
				   valorDefecto);
		}
		return s;
	}
	
	public void iniciar(Component padre){
		if(iniciado){
			int seleccion = -1;
			while(seleccion==-1){
				seleccion = JOptionPane.showOptionDialog(
					   padre,
					   "Ya hay un juego en curso, realmente quieres iniciar otro nuevo?", 
					   "NUEVO JUEGO",
					   JOptionPane.YES_NO_OPTION,
					   JOptionPane.WARNING_MESSAGE,
					   null,
					   null,
					   null);
			}
			if(seleccion==0){
				String jug1 = pedirNombre("jugador 1",padre, "jugador 1");
				String jug2 = pedirNombre("jugador 2",padre, "ordenador");
				String estilo = "MEZCLA";
				if(jug2.equals("ordenador")){
					Object [] opciones = {"Defensivo","Agresivo","Mezcla"};
					int n = JOptionPane.showOptionDialog(this,"Selecciona el estilo de juego del ordenador: ","ESTILO",
					                    JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,null,opciones,opciones[2]);
					if(n<0)
						estilo = (String)opciones[2];
					else
						estilo = (String)opciones[n];
				}
				movimientos = new ComprobadorMov(tam,damas,jug1,jug2,estiloJuego.valueOf(estilo.toUpperCase()));
				repaint();
			}
		}else{
			iniciado = true;
			String jug1 = pedirNombre("jugador 1",padre,"jugador 1");
			String jug2 = pedirNombre("jugador 2",padre,"ordenador");
			String estilo = "MEZCLA";
			if(jug2.equals("ordenador")){
				Object [] opciones = {"Defensivo","Agresivo","Mezcla"};
				int n = JOptionPane.showOptionDialog(this,"Selecciona el estilo de juego del ordenador: ","ESTILO",
				                    JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,null,opciones,opciones[2]);
				if(n<0)
					estilo = (String)opciones[2];
				else
					estilo = (String)opciones[n];
			}
			movimientos = new ComprobadorMov(tam,damas,jug1,jug2,estiloJuego.valueOf(estilo.toUpperCase()));
			repaint();
		}
	}
	
	public void volverAnterior(){
		movimientos.volverTableroAnterior();
		espera=2;
	}
	
	public void finalizar(){
		iniciado = false;
	}
	
	private void pintarFicha(Image img, int i, int j, Graphics g, boolean seleccionada){
		int x = borde + tamCasilla*j;
		int y = borde + tamCasilla*i;
		if(seleccionada){
			g.setColor(Color.CYAN);
			g.fillRect(x, y, tamCasilla, tamCasilla);
		}
		x+=5;
		y+=5;
		g.drawImage(img, x, y, this);
	}
	
	@Override
	public void mouseClicked(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseEntered(MouseEvent arg0) {
		// TODO Auto-generated method stub
		setCursor(new Cursor(Cursor.HAND_CURSOR));
	}

	@Override
	public void mouseExited(MouseEvent arg0) {
		// TODO Auto-generated method stub
		setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
		
	}

	@Override
	public void mousePressed(MouseEvent arg0) {
		if(iniciado){
			int y = arg0.getX();
			int x = arg0.getY();
			java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
			if(x>borde && x<tamCasilla*tamToInt()+borde && y>borde && y<tamCasilla*tamToInt()+borde){
				x = (x - borde)/tamCasilla;
				y = (y - borde)/tamCasilla;
				movimientos.procesarMov(x, y);
			}
			if(movimientos.jugadorActual().equals("ordenador")){
				repaint();
				if(espera==0)
					movimientos.procesarMov(1, 1);
				else{
					damas.setEstado(movimientos.getNomJug1()+": haz click una vez mas... ");
					espera--;
				}
			}else
				espera=1;
		}
		repaint();
	}

	@Override
	public void mouseReleased(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	
	public void esperar (int milisegs){
		long t0, t1;
		t0 =  System.currentTimeMillis();
		do{
			t1 = System.currentTimeMillis();
		}
		while (t1 - t0 < milisegs);
	}
	
	

}
